<?php
/*
 * 访问者模式 ，是在组合模式之上
 * 一款文明游戏 组合模式
 * Army(军队),TroopCarrier(运兵车), 组合对象
 * Archer(弓箭手),LaserCanonUnit(激光炮),是局部对象
 * 有一个军队访问 ArmyVisitor 的抽象类，包含 对局部对象 军队的攻击强度TextDumpArmyVisitor、 军队需要缴纳税金TaxCollectionVisitor
*/
function my_autoloader($class) {
    //var_dump($class);
    include $class . '.php';
}
spl_autoload_register('my_autoloader');

//$res = UnitScript::joinExisting(new TroopCarrier(),new LaserCanonUnit());


//var_dump($res->bombardStrength());
//die();


//创建一个Army对象
/*$main_army = new Army();

//添加一些Unit对象
$main_army->addUnit( new Archer() );
$main_army->addUnit( new LaserCanonUnit() );


//创建一个新的Army对象
$sub_army  =  new Army();
//添加一些Unit对象
$sub_army->addUnit( new Archer());
$sub_army->addUnit( new Archer());
$sub_army->addUnit( new Archer());


//把第二个Army对象添加到第一个Army对象中去
$main_army->addUnit($sub_army);

//所有的攻击强度计算都在幕后进行
print "main_army 攻击强度：{$main_army->bombardStrength()}\n<BR />";
print "sub_army 攻击强度：{$sub_army->bombardStrength()}\n<BR />";

print "main_army 攻击强度：{$main_army->textDump()}\n<BR />";
*/


//访问者模式
//创建一个Army对象
$main_army1 = new ArmyPlus();

//添加一些Unit对象
$main_army1->addUnitPlus( new Archer() );

$main_army1->addUnitPlus( new LaserCanonUnit() );

//var_dump($main_army1);

$textdump = new TextDumpArmyVisitor();
$main_army1->accept($textdump);
print $textdump->getText();

//军队缴税
$taxcollector = new TaxCollectionVisitor();
$main_army1->accept($taxcollector);
print "\n<BR/>\n<BR/>\n<BR/>".$taxcollector->getReport()."\n<BR/>";
print "军队缴税 TOTAL : ";
print $taxcollector->getTax()."\n<BR/>";
